package com.demo.designpattern.singleton;

/**
 * Created by hunter
 *
 * @Description 懒汉式
 */
public class SlackerSingleton {

    private static volatile SlackerSingleton INSTANCE;

    private SlackerSingleton() {
        System.out.println("懒汉式单例被初始化拉...");
    }

    public static SlackerSingleton getINSTANCE() {

        /**
         *    第一个判断是否为null是为了判断是否初始化
         *    第二行sync是为了防止多次初始化
         *    第三行判断是为了, 比如两个线程进来同时发现未初始化时, 第二个进入sync方法体的线程不会再初始化单例对象
         *    volatile保证内存可见, 防止刚给单例引用(INSTANCE)赋予内存地址, 未进行初始化之类的操作时，其它线程就拿去用了
         */
        if (INSTANCE == null) {
            synchronized (SlackerSingleton.class) {
                if (INSTANCE == null) {
                    INSTANCE = new SlackerSingleton();
                }
            }
        }
        return INSTANCE;
    }
}
